# !/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
===========================
@Time : 2022/7/24 0024 11:25
@Author : 测试开发工程师
@File : 6. linux 三剑客之 grep.py
@Software: PyCharm
============================
"""

"""
linux 三剑客：                                linux 三剑客                 与 sql 对比(结构化查询语言)
grep : 基于正则表达式查找满足条件的行            grep 数据查找定位             select * from table like "%xx"
awk ： 根据定位到的数据行处理其中的分段           awk 数据切片                 select field（字段） from table
sed ： 根据定位到的数据行修改数据                sed 数据修改              update table set field=new where field=old

平台实现差异与官方文档
    mac 上的实现与 gnu 的实现有差异
    不同版本之间有小的语法差异
    可以通过独立下载 gawk 等工具实现
    
BRE 基本正则表达式
    ^ ：开头 ， $ ：结尾
    [a-z][0-9]区间，如果开头带有 ^ 表示不能匹配区间内的元素
    *： 0个或多个
    .：表示任意字符
    
ERE 扩展正则表达式
    基本表达式（BRE）基础上扩展
    ？ 非贪婪匹配
    + 一个或者多个
    () 分组
    {} 范围约束
    | 匹配多个表达式的任何一个

"""


"""
grep 基于正则表达式查找满足条件的行
内容检索：
    获取行： grep pattern file     例如： grep a /tmp/1
    获取内容（只过滤感兴趣的内容）： grep -o pattern file
    获取上下文： grep -A -B -C pattern file   例如： grep -B1 '2,'
    
文件检索：
    目录递归搜索： grep pattern -r dir/   例如： grep 111 -r /tmp/demo
    展示匹配文件名： grep -H 111 /tmp/1
    只展示匹配文件名： grep -l 111 /tmp/1
    
范围约束：
    忽略大小写： grep -i pattern file
    不显示匹配的行 ： grep -v pattern file
    使用扩展正则表达式： grep -E pattern file
    文件范围和目录范围约束： grep 111 -r /tmp/demo/ --include '11*'
    
进程过滤：
    进程过滤场景比较特殊，需要注意    ps -ef | grep ssh
    grep 本身会开启新进程，所以需要单独过滤掉 grep 进程   ps -ef | grep ssh | grep -v grep

grep 用于 查找文件符合条件的字符串
参数：
    -a 或 -text ： 不要忽略二进制的数据
    -A（显示行数）或 -after-context （显示行数）
    ......
    
举例：
    1. 在当前目录中，查找后缀 有 file 字样的文件中包含 test 字符串的文件，并打印该字符串的行
    grep test *file
    



"""